package com.ss.utils;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

/**
 * 出差相关工具
 */
public class TravelTools {
    public static void main(String[] args) {
        // 示例输入
        String goTime = "2024-11-10 14:44:00";
        String returnTime = "2024-11-13 09:55:00";

        // 调用方法计算时间间隔天数
        System.out.println("酒店入住天数为: " + getHotelDays(goTime, returnTime));
        System.out.println("出差补助天数为: " + getTravelDays(goTime, returnTime));
        System.out.println("出差补助金额为: " + getTravelSubsidy(getTravelDays(goTime,returnTime))) ;

        // 打印开具酒店发票所需信息
        outputHotelInvoiceInfo(goTime,returnTime,180.0);
    }

    /**
     * 功能：生成报销单
     */
    public static void getReimbursementDocuments(){
        // 部门
        // 当前日期
        // 出差人
        // 出差事由
        // 出发时间 出发地点 结束时间 结束地点 交通工具 费用
        // 各项费用合计
        // 费用合计
        // 费用合计大写
    }

    /**
     * 功能：计算出差补助天数
     * @param goTimeStr 火车出发时间（24h）
     * @param returnTimeStr 火车返回时间（24h）
     * @return 补助天数
     */
    public static double getTravelDays(String goTimeStr, String returnTimeStr) {
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 解析输入字符串为LocalDateTime对象
        LocalDateTime goTime = LocalDateTime.parse(goTimeStr, formatter);
        LocalDateTime returnTime = LocalDateTime.parse(returnTimeStr, formatter);

        if(goTime.isAfter(returnTime)){
            System.out.println("开始时间在结束时间之后，不合逻辑！");
            return -1;
        }

        // 处理火车出发时间如果在12点之后，则当天只算0.5天
        double startDayFraction = goTime.toLocalTime().isAfter(LocalTime.NOON) ? 0.5 : 1;

        // 处理火车返回时间如果在12点之前，则当天只算0.5天
        double endDayFraction = returnTime.toLocalTime().isBefore(LocalTime.NOON) ? 0.5 : 1;

        // 计算中间的天数
        long daysBetween = ChronoUnit.DAYS.between(goTime.toLocalDate().atStartOfDay(), returnTime.toLocalDate().atStartOfDay()) - 1;

        // 计算总天数，包括部分天
        double totalDays = daysBetween + startDayFraction + endDayFraction;

        return totalDays;
    }

    /**
     * 功能：计算入住酒店天数
     * @param goTimeStr 火车出发时间（24h）
     * @param returnTimeStr 火车返回时间（24h）
     * @return 入住酒店天数
     */
    public static long getHotelDays(String goTimeStr, String returnTimeStr){
        // 定义日期时间格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        // 解析输入字符串为LocalDateTime对象
        LocalDateTime goTime = LocalDateTime.parse(goTimeStr, formatter);
        LocalDateTime returnTime = LocalDateTime.parse(returnTimeStr, formatter);

        // 计算完整的天数差
        long fullDaysBetween = ChronoUnit.DAYS.between(goTime.toLocalDate().atStartOfDay(), returnTime.toLocalDate().atStartOfDay());

        return fullDaysBetween;
    }

    /**
     * 功能：计算出差补助总金额
     * @param daysNum 补助天数
     * @return 出差补助总金额
     */
    public static double getTravelSubsidy(double daysNum){
        double totalExpenses = 0;
        int subsidy5 = 5 * 60;
        int subsidy10 = 5 * 60 + 5 * 80;

        if(daysNum > 0 && daysNum <= 5){
            totalExpenses = daysNum * 60;
        }else if(daysNum > 5 && daysNum <= 10){
            totalExpenses = subsidy5 + (daysNum - 5) * 80;
        }else if(daysNum > 10){
            totalExpenses = subsidy10 + (daysNum - 10) * 100;
        }

        return totalExpenses;
    }

    /**
     * 功能：打印开具酒店发票所需信息
     * @param goTime 火车票出发时间
     * @param returnTime 火车票返回时间
     * @param hotelPrice 酒店每天价格
     */
    public static void outputHotelInvoiceInfo(String goTime,String returnTime,Double hotelPrice){
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        System.out.println("====酒店发票抬头（开专票）====");
        System.out.println("东方众通（北京）用电技术有限公司\n" +
                "税号：91130301MA7EJ1W02Y \n" +
                "地址电话：北京市昌平区立业路5号院2号楼1至7层101内6层601-3 010-60144689 \n" +
                "开户行及账号：中国建设银行北京沙河支行11050181500000001147");
        System.out.println("====酒店发票备注====");
        System.out.println(LocalDate.parse(goTime,formatter) + " 到 " + LocalDate.parse(returnTime,formatter).minusDays(1) +" 共计"+ TravelTools.getHotelDays(goTime,returnTime) +"天 共计"+(TravelTools.getHotelDays(goTime,returnTime) * hotelPrice)+"元");
    }


}